// pages/activity/vote/vote.js
const activityApi = require('../../../api/activity.js')
const voteApi = require('../../../api/vote.js')
const api = require('../../../utils/api.js')
const util = require('../../../utils/util.js')
const app = getApp()

Page({
  data: {
    activityId: null,
    activity: {},
    categories: [],  // 所有角色分类（包含候选人）
    filteredCategories: [],  // 筛选后的分类
    votingOpen: false,  // 加油是否开放
    voteStatusText: '',
    myVotedCount: 0,  // 我已加油数
    canManage: false,  // 是否是管理员
    
    // UI状态
    viewMode: 'vote',  // 'vote'=参会加油, 'ranking'=排行榜
    selectedCategoryId: null,  // 选中的分类ID（null=全部）
    
    // 弹窗
    showVoteQRModal: false,
    voteQrcodeUrl: '',
    
    // 分享标志
    isSharingVote: false,
  },

  onLoad(options) {
    // 支持scene参数（从加油二维码进入）
    let activityId = options.id
    
    if (options.scene && !activityId) {
      try {
        const sceneDecoded = decodeURIComponent(options.scene)
        console.log('📱 解析加油scene参数:', sceneDecoded)
        // scene格式: vote=19
        const match = sceneDecoded.match(/vote=(\d+)/)
        if (match && match[1]) {
          activityId = match[1]
          console.log('✅ 从scene获取activityId:', activityId)
        } else {
          console.warn('⚠️ 正则匹配失败，尝试手动解析')
          // 手动解析 vote=19
          if (sceneDecoded.startsWith('vote=')) {
            activityId = sceneDecoded.replace('vote=', '')
            console.log('✅ 手动解析获取activityId:', activityId)
          }
        }
      } catch (error) {
        console.error('❌ 解析scene参数失败:', error)
      }
    }

    if (activityId) {
      this.setData({ activityId: activityId })
      this.loadData()
    } else {
      console.error('❌ 未获取到activityId，options:', options)
      wx.showModal({
        title: '参数错误',
        content: '无法获取会议ID，请重新扫描二维码或从会议详情进入。',
        showCancel: false,
        confirmText: '返回',
        success: () => {
          wx.navigateBack({ delta: 1 })
        }
      })
    }
  },

  async loadData() {
    try {
      console.log('📡 开始加载加油数据, activityId:', this.data.activityId)
      
      // 并行加载会议信息和加油结果
      const [activityRes, voteRes] = await Promise.all([
        activityApi.getActivityDetail(this.data.activityId),
        this.loadVoteResults()
      ])

      console.log('📦 会议信息响应:', activityRes)

      if (activityRes.code === 200 || activityRes.success) {
        const activity = activityRes.data
        const userInfo = wx.getStorageSync('userInfo')
        
        // 检查加油状态
        const now = new Date()
        const votingStart = new Date(activity.voting_start_time)
        const votingEnd = new Date(activity.voting_end_time)
        const votingOpen = activity.voting_enabled && now >= votingStart && now <= votingEnd
        
        let voteStatusText = ''
        if (!activity.voting_enabled) {
          voteStatusText = '加油未启用'
        } else if (now < votingStart) {
          voteStatusText = `加油将于 ${activity.voting_start_time} 开始`
        } else if (now > votingEnd) {
          voteStatusText = '加油已结束'
        } else {
          voteStatusText = '加油进行中'
        }
        
        this.setData({
          activity: activity,
          votingOpen: votingOpen,
          voteStatusText: voteStatusText,
          canManage: activity.can_manage || false
        })
        
        console.log('✅ 会议数据加载成功:', activity.title)
      } else {
        console.error('❌ 会议信息加载失败:', activityRes)
        wx.showModal({
          title: '加载失败',
          content: activityRes.message || '无法加载会议信息，请稍后重试。',
          showCancel: false
        })
      }
    } catch (error) {
      console.error('❌ 加载数据失败:', error)
      wx.showModal({
        title: '加载失败',
        content: `无法连接到服务器，请检查网络连接。错误：${error.message || error}`,
        showCancel: false,
        confirmText: '返回',
        success: () => {
          wx.navigateBack({ delta: 1 })
        }
      })
    }
  },

  async loadVoteResults() {
    try {
      // 检查是否有token（已登录）
      const token = wx.getStorageSync('token')
      let wxCode = null
      
      // 如果没有token，获取wx_code用于匿名用户识别
      if (!token) {
        try {
          const loginRes = await wx.login()
          if (loginRes.code) {
            wxCode = loginRes.code
            console.log('👻 未登录用户，使用wx_code查询加油状态')
          }
        } catch (err) {
          console.warn('⚠️ 获取wx_code失败:', err)
        }
      }
      
      const res = await voteApi.getVoteResults(this.data.activityId, wxCode)
      
      if (res.code === 200 || res.success) {
        const categories = res.data.categories || []
        const myVotedCount = res.data.my_voted_count || 0
        
        // 详细日志调试照片URL
        console.log('🔍 加油结果原始数据:', res.data)
        categories.forEach((cat, idx) => {
          console.log(`🔍 分类 ${idx}: ${cat.name}, 候选人数: ${cat.candidates?.length}`)
          cat.candidates?.forEach((c, cidx) => {
            console.log(`  🔍 候选人 ${cidx}: ${c.name}`)
            console.log(`    - photo_url: ${c.photo_url}`)
            console.log(`    - performance_photo_urls: ${JSON.stringify(c.performance_photo_urls)}`)
          })
        })
        
        this.setData({
          categories: categories,
          filteredCategories: categories,  // 初始显示全部
          myVotedCount: myVotedCount
        })
        
        console.log('✅ 加载加油结果成功:', categories.length, '个分类')
        return res
      }
    } catch (error) {
      console.error('❌ 加载加油结果失败:', error)
      throw error
    }
  },

  /**
   * 切换模式（参会加油/排行榜）
   */
  switchMode(e) {
    const mode = e.currentTarget.dataset.mode
    this.setData({ viewMode: mode })
    console.log('🔄 切换模式:', mode)
  },

  /**
   * 按分类筛选
   */
  filterByCategory(e) {
    const categoryId = e.currentTarget.dataset.id
    
    let filteredCategories
    if (categoryId === null) {
      // 显示全部
      filteredCategories = this.data.categories
    } else {
      // 筛选指定分类
      filteredCategories = this.data.categories.filter(cat => cat.id === categoryId)
    }
    
    this.setData({
      selectedCategoryId: categoryId,
      filteredCategories: filteredCategories
    })
    
    console.log('🔍 筛选分类:', categoryId === null ? '全部' : categoryId)
  },

  /**
   * 为候选人加油（支持匿名加油）
   */
  async voteForCandidate(e) {
    const candidateId = e.currentTarget.dataset.candidateId
    const categoryId = e.currentTarget.dataset.categoryId
    
    if (!this.data.votingOpen) {
      util.showError('加油未开放')
      return
    }

    try {
      wx.showLoading({ title: '提交中...' })
      
      // 获取微信code（用于匿名加油识别）
      let wxCode = null
      const token = wx.getStorageSync('token')
      if (!token) {
        try {
          const loginRes = await new Promise((resolve, reject) => {
            wx.login({
              success: res => resolve(res),
              fail: err => reject(err)
            })
          })
          wxCode = loginRes.code
          console.log('✅ 获取微信code用于加油:', wxCode ? '成功' : '失败')
        } catch (loginError) {
          console.warn('⚠️ 获取微信code失败，继续加油:', loginError)
          // 继续加油，后端会使用IP识别
        }
      } else {
        console.log('💚 已登录用户加油')
      }

      const res = await voteApi.submitVote(this.data.activityId, [candidateId], wxCode)

      wx.hideLoading()

      if (res.code === 200 || res.success) {
        util.showSuccess('加油成功')
        // 重新加载加油结果
        this.loadVoteResults()
      } else {
        util.showError(res.message || '加油失败')
      }
    } catch (error) {
      wx.hideLoading()
      console.error('❌ 加油失败:', error)
      util.showError('加油失败，请重试')
    }
  },

  /**
   * 取消加油
   */
  async cancelVote(e) {
    const candidateId = e.currentTarget.dataset.candidateId || e.currentTarget.dataset.candidateid
    const categoryId = e.currentTarget.dataset.categoryId || e.currentTarget.dataset.categoryid
    
    console.log('🔍 取消加油参数:', { candidateId, categoryId, dataset: e.currentTarget.dataset })
    
    if (!candidateId) {
      util.showError('参数错误，请重试')
      return
    }
    
    if (!this.data.votingOpen) {
      util.showError('加油已结束，无法取消')
      return
    }

    try {
      // 显示确认对话框
      const confirmRes = await new Promise((resolve) => {
        wx.showModal({
          title: '确认取消',
          content: '确定要取消对该候选人的加油吗？',
          confirmText: '确定取消',
          cancelText: '我再想想',
          success: (res) => resolve(res)
        })
      })

      if (!confirmRes.confirm) {
        return
      }

      wx.showLoading({ title: '取消中...' })
      
      // 获取微信code（用于匿名用户识别）
      let wxCode = null
      const token = wx.getStorageSync('token')
      if (!token) {
        try {
          const loginRes = await new Promise((resolve, reject) => {
            wx.login({
              success: res => resolve(res),
              fail: err => reject(err)
            })
          })
          wxCode = loginRes.code
          console.log('✅ 获取微信code用于取消加油:', wxCode ? '成功' : '失败')
        } catch (loginError) {
          console.warn('⚠️ 获取微信code失败，继续取消加油:', loginError)
        }
      } else {
        console.log('💚 已登录用户取消加油')
      }

      console.log('📤 发送取消加油请求:', { activityId: this.data.activityId, candidateId, wxCode: wxCode ? '有' : '无' })
      const res = await voteApi.cancelVote(this.data.activityId, candidateId, wxCode)

      wx.hideLoading()

      if (res.code === 200 || res.success) {
        util.showSuccess('已取消加油')
        // 重新加载加油结果
        this.loadVoteResults()
      } else {
        util.showError(res.message || '取消失败')
      }
    } catch (error) {
      wx.hideLoading()
      console.error('❌ 取消加油失败:', error)
      util.showError('取消失败，请重试')
    }
  },

  /**
   * 上传演讲风采照片（仅管理员）
   */
  uploadPerformancePhoto(e) {
    const registrationId = e.currentTarget.dataset.registrationId
    
    wx.chooseMedia({
      count: 1,
      mediaType: ['image'],
      sourceType: ['album', 'camera'],
      success: async (res) => {
        const tempFile = res.tempFiles[0].tempFilePath
        
        try {
          wx.showLoading({ title: '上传中...' })
          
          const token = wx.getStorageSync('token')
          const BASE_URL = 'https://naturedao.tech/api/v1'
          
          wx.uploadFile({
            url: `${BASE_URL}/registrations/${registrationId}/performance-photo`,
            filePath: tempFile,
            name: 'file',
            header: {
              'Authorization': `Bearer ${token}`
            },
            success: (uploadRes) => {
              wx.hideLoading()
              const data = JSON.parse(uploadRes.data)
              if (data.success) {
                util.showSuccess('上传成功')
                // 重新加载加油结果
                this.loadVoteResults()
              } else {
                util.showError(data.message || '上传失败')
              }
            },
            fail: (error) => {
              wx.hideLoading()
              console.error('❌ 上传失败:', error)
              util.showError('上传失败')
            }
          })
        } catch (error) {
          wx.hideLoading()
          console.error('❌ 上传失败:', error)
          util.showError('上传失败')
        }
      },
      fail: (err) => {
        console.log('选择照片失败:', err)
        // 用户拒绝隐私授权
        if (err.errMsg && (err.errMsg.includes('104') || err.errMsg.includes('privacy'))) {
          wx.showModal({
            title: '需要授权',
            content: '为了上传风采照片，需要您同意隐私保护指引。',
            showCancel: false,
            confirmText: '我知道了'
          })
        } else if (!err.errMsg || !err.errMsg.includes('cancel')) {
          util.showError('选择照片失败')
        }
      }
    })
  },

  /**
   * 准备分享加油
   */
  prepareShareVote() {
    this.setData({ isSharingVote: true })
  },

  /**
   * 分享设置
   */
  onShareAppMessage() {
    const { activity, isSharingVote } = this.data
    
    if (isSharingVote) {
      this.setData({ isSharingVote: false })
      return {
        title: `【加油】${activity.title}`,
        path: `/pages/activity/vote/vote?id=${this.data.activityId}`,
        imageUrl: '/assets/icons/logo1.png'
      }
    }
    
    return {
      title: activity.title,
      path: `/pages/activity/detail/detail?id=${this.data.activityId}`
    }
  },

  /**
   * 生成加油二维码
   */
  async generateVoteQRCode() {
    try {
      wx.showLoading({ title: '生成小程序码中...' })
      
      const BASE_URL = 'https://naturedao.tech/api/v1'
      const qrcodeUrl = `${BASE_URL}/activities/${this.data.activityId}/vote-wxacode?t=${Date.now()}`
      
      console.log('📱 加油小程序码URL:', qrcodeUrl)
      
      wx.hideLoading()
      
      // 显示二维码弹窗
      this.setData({
        showVoteQRModal: true,
        voteQrcodeUrl: qrcodeUrl
      })
      
    } catch (error) {
      wx.hideLoading()
      console.error('生成加油小程序码失败:', error)
      util.showError('生成失败')
    }
  },

  /**
   * 关闭加油二维码弹窗
   */
  closeVoteQRModal() {
    this.setData({ showVoteQRModal: false })
  },

  /**
   * 保存加油二维码
   */
  saveVoteQRCode() {
    const { voteQrcodeUrl } = this.data
    
    wx.downloadFile({
      url: voteQrcodeUrl,
      success: (res) => {
        wx.saveImageToPhotosAlbum({
          filePath: res.tempFilePath,
          success: () => {
            util.showSuccess('已保存到相册')
            this.closeVoteQRModal()
          },
          fail: () => {
            util.showError('保存失败，请检查相册权限')
          }
        })
      },
      fail: () => {
        util.showError('下载失败')
      }
    })
  },

  /**
   * 导出Excel
   */
  async exportToExcel() {
    try {
      wx.showLoading({ title: '生成中...' })
      
      const token = wx.getStorageSync('token')
      const BASE_URL = 'https://naturedao.tech/api/v1'
      const exportUrl = `${BASE_URL}/activities/${this.data.activityId}/votes/export?token=${token}`
      
      wx.downloadFile({
        url: exportUrl,
        success: (res) => {
          if (res.statusCode === 200) {
            // 先保存文件到本地
            wx.saveFile({
              tempFilePath: res.tempFilePath,
              success: (saveRes) => {
                wx.hideLoading()
                const savedFilePath = saveRes.savedFilePath
                
                // 使用外部应用打开（允许选择应用和保存）
                wx.openDocument({
                  filePath: savedFilePath,
                  fileType: 'xlsx',
                  showMenu: true,  // 显示分享和保存菜单
                  success: () => {
                    console.log('✅ 打开Excel成功')
                    util.showSuccess('文件已生成，可选择应用打开或保存')
                  },
                  fail: (error) => {
                    console.error('❌ 打开Excel失败:', error)
                    util.showError('文件已下载，但打开失败')
                  }
                })
              },
              fail: (error) => {
                wx.hideLoading()
                console.error('❌ 保存文件失败:', error)
                util.showError('文件保存失败')
              }
            })
          } else {
            wx.hideLoading()
            util.showError('导出失败')
          }
        },
        fail: (error) => {
          wx.hideLoading()
          console.error('❌ 导出失败:', error)
          util.showError('导出失败')
        }
      })
    } catch (error) {
      wx.hideLoading()
      console.error('❌ 导出失败:', error)
      util.showError('导出失败')
    }
  },

  /**
   * 阻止冒泡
   */
  preventClose() {
    // 阻止冒泡，防止点击弹窗内容时关闭
  }
})
